package com.nowcoder.community.dao;

import com.nowcoder.community.entity.Message;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * @author panxingyu
 */
@Mapper
public interface MessageMapper {
    /**
     * 查询当前用户的会话列表，针对每个会话只返回一条最新的私信
     * @param userId    用户ID
     * @param offset    分页、起始行
     * @param limit     分页、显示上限
     * @return          私信集合
     */
    List<Message> selectConversations(int userId, int offset, int limit);

    /**
     * 查询当前用户的所有会话数量（分页）
     * @param userId    用户ID
     * @return          会话数量
     */
    int selectConversationCount(int userId);

    /**
     * 查询指定会话的私信列表
     * @param conversationId    会话ID
     * @param offset            分页
     * @param limit             分页
     * @return                  私信对象集合
     */
    List<Message> selectLetters(String conversationId, int offset, int limit);

    /**
     * 查询指定会话的私信数量
     * @param conversationId    会话ID
     * @return                  私信数量
     */
    int selectLetterCount(String conversationId);

    /**
     * 查询未读私信的数量
     * @param userId            用户ID，用于查询该用户所有的未读私信数量
     * @param conversationId    会话ID，用于查询指定会话的所有未读私信数量（动态sql）
     * @return
     */
    int selectLetterUnreadCount(int userId, String conversationId);

    /**
     * 添加私信
     * @param message   私信
     * @return          #
     */
    int insertMessage(Message message);

    /**
     * 修改消息状态
     * @param ids       id
     * @param status    更新后的状态
     * @return          #
     */
    int updateStatus(List<Integer> ids, int status);

    /**
     * 查询某个通知类型下最新的通知
     * @param userId    用户ID
     * @param topic     通知类型
     * @return          消息对象
     */
    Message selectLatestNotice(int userId, String topic);

    /**
     * 查询某个通知类型中所包含的通知数量
     * @param userId    用户ID
     * @param topic     通知类型
     * @return          通知数量
     */
    int selectNoticeCount(int userId, String topic);

    /**
     * 查询未读通知数量（动态实现某个主题的未读）
     * @param userId
     * @param topic
     * @return
     */
    int selectNoticeUnreadCount(int userId, String topic);

    /**
     * 查询通知列表
     * @param userId    用户ID
     * @param topic     通知类型
     * @param offset    分页
     * @param limit     分页
     * @return          通知对象集合
     */
    List<Message> selectNotices(int userId, String topic, int offset, int limit);
}
